home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 February
/
EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso
/
progs
/
sviluppo
/
pike-0.4.0
/
lib
/
include
/
getopt.pre.pike
< prev
next >
Wrap
Text File
|
1997-01-10
|
3KB
|
150 lines
// startpid = (int)find_arg(argv, "s", ({ "start-script-pid" }),
// ({ "ROXEN_START_SCRIPT_PID"}));
// configuration_dir = find_arg(argv, "d", ({ "config-dir",
// "configurations",
// "configuration-directory" }),
// ({ "ROXEN_CONFIGDIR", "CONFIGURATIONS" }),
// "../configurations");
string|int find_option(array argv,
array|string shortform,
array|string|void longform,
array|string|void envvars,
mixed|void def)
{
mixed value;
int i,hasarg;
hasarg=query_num_arg() == 5;
if(!arrayp(longform)) longform=({longform});
if(!arrayp(shortform)) shortform=({shortform});
if(!arrayp(envvars)) envvars=({envvars});
for(i=1; i<sizeof(argv); i++)
{
if(argv[i] && strlen(argv[i]) > 1)
{
if(argv[i][0] == '-')
{
if(argv[i][1] == '-')
{
string tmp;
int nf;
if(argv[i]=="--") break;
sscanf(tmp=argv[i], "%s=%s", tmp, value);
if(search(longform, tmp[2..]) != -1)
{
argv[i]=0;
if(hasarg)
{
if(!value)
{
if(i == sizeof(argv)-1)
{
werror("No argument to option "+tmp+".\n");
exit(1);
}
value=argv[i+1];
argv[i+1]=1;
}
return value;
} else {
return value || 1;
}
}
} else {
int j;
for(j=1;j<strlen(argv[i]);j++)
{
string opt;
int pos;
if(search(shortform, opt=argv[i][j..j]) != -1)
{
string arg;
arg=argv[i][j+1..];
if(hasarg)
{
if(arg=="")
{
if(i == sizeof(argv)-1)
{
werror("No argument to option -"+argv[i][j..j]+".\n");
exit(1);
}
value=argv[i+1];
argv[i+1] = 0;
} else {
value=arg;
arg="";
}
} else {
value=1;
}
argv[i]=argv[i][..j-1]+arg;
if(argv[i]=="-") argv[i]=0;
return value;
}
}
}
} else {
if(getenv("POSIX_ME_HARDER"))
break;
}
}
}
if(arrayp(envvars))
foreach(envvars, value)
if(value && (value=getenv(value)))
return value;
return def;
}
string *get_args(string *argv)
{
int i;
for(i=1;i<sizeof(argv);i++)
{
if(argv[i] && strlen(argv[i])>1 && argv[i][0]=='-')
{
if(argv[i][1]=='-')
{
if(argv[i]=="--")
{
argv[i]=0;
break;
}else{
werror("Unknown option "+argv[i]+".\n");
exit(1);
}
}else{
if(strlen(argv[i]) == 2)
werror("Unknown option "+argv[i]+".\n");
else
werror("Unknown options "+argv[i]+".\n");
exit(1);
}
}
}
argv-=({0});
return argv;
}
void create()
{
add_constant("find_option",find_option);
add_constant("get_args",get_args);
}